小智雅汇 2018-12-27 11:35
在不同作用域内声明的变量或函数可以同名,但如果在同一个作用域内同时存在局部变量(函数)和全局变量(函数)时,通常局部(或内部)变量(或函数)会覆盖掉全局(或外部)的变量(或函数)。如何在这个作用域内访问外部作用域中同名的变量(函数)?使用作用域限定符。
1 区分同名的全局变量和局部变量
#include<iostream>
using namespace std;
int sum=0;
const int N=15;
int main()
{
int n,a[N],sum=0;
cin>>n;
for(int i=0;i cin>>a[i];
for(int i=0;i {
if(i%2==0) sum+=a[i];
::sum+=a[i];
}
cout<<"all="<<::sum<<' '<<"odd="<<sum;
return 0;
}
2 类的成员函数在类外定义时,指明该函数的作用域为该类
#include<iostream>
using namespace std;
int calculate(int x)
{return 2*x*x+4*x+6;}
class A
{
private:
int a;
public:
int calculate();
A(int m) {a=m;}
};
int A::calculate()
{return 2*a*a+4*a+5;}
int main()
{
A b(5);
cout<<::calculate(5)<<endl;
cout<<b.calculate()<<endl;
return 0;
}
3 命名空间限定
当想输出某命名空间(如:namespace ns1)中成员的数据时,可以采用命名空间名和作用域限定符::指向该成员数据。
#include <iostream>
using namespace std;
namespace ns1 //命名空间ns1
{
int a = 3;
double b = 4;
double tax()
{
return a * b;
}
namespace ns2 // 嵌套的命名空间ns2
{
int age =11;
}
}
void main()
{
std:cout<<ns1::a<<endl; // 输出命名空间ns1中成员的数据
cout<<ns1::tax()<<endl;
cout<<ns1::ns2::age<<endl; // 需要依次指定外层和内层的命名空间名
cin.get();
}
4 显示调用父类中被子类覆盖的函数
在子类中可用::显式调用父类中的成员函数或成员变量,可以调用到父类被子类覆盖的函数。如子类B和父类A均有void fun();这个函数,因为是函数覆盖,直接调用是调用不了父类中的fun(),这时,只要A::fun()这样显式指明即可调用。
5 要表明某个函数不属于任何类时
通常是类里有成员函数跟全局函数名字相同时使用。
例如在某个类里这样写
::change(int& i); //表明change函数不属于任何类,通常是一个全局函数
6 在类内使用typedef声明了某类型的别名,在类外使用时
如在类A内有这样的声明:
typedef unsign int UINT;
在类外需要定义一个width类型的变量时可以这样写:
A::UINT i;
7 使用类的静态成员变量或成员函数时使用
静态成员既可以通过对象名引用,也可以通过类名+::引用。
-End-
本页共82段,1627个字符,2813 Byte(字节)